package com.hyper_yang._01_jdbc.prob;

import com.hyper_yang._01_jdbc.pojo.Account;

import java.sql.*;
import java.util.Scanner;

/*
 SQL再拼接数据时，会出现 SQL注入的问题  1 or 1=1
    SQL注入: 就是用户在输入的数据中，掺杂了数据库的一些关键字或命令，导致SQL无论如何执行都是正确的结果
  解决方案:
    PreparedStatement接口: 不采用 SQL拼接的方式，而是采用 ? 占位符的方式
 */
public class ConcatTest {
    public static void main(String[] args) throws SQLException {
        // todo: 从键盘输入 id值，到数据库去查询
        System.out.println("请输入要查询的id: ");
        Scanner scanner = new Scanner(System.in);
        String id = scanner.nextLine();

        // 1. 注册驱动
        // 2. 获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test1", "root", "abc123");
        // 3. 准备 sql
//        String sql = "select id,name,balance from t_account where id = " + id;
        String sql = "select id,name,balance from t_account where id = ?";
        // 4. 创建发送器
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 4.1 给占位符赋值
        // todo: ? 占位符，不管传入的是什么值，都会在值得前后加 ',有效避免用户输入关键字
        /**
         * parameterIndex: 第几个占位符
         * param2: 赋的值是什么
         */
        preparedStatement.setObject(1, id);
        // 5. 执行 sql,接收结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        // 6. 处理结果
        while (resultSet.next()) {
            int id1 = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int balance = resultSet.getInt("balance");
            Account account = new Account(id1, name, balance);
            System.out.println(account);
        }
        // 7. 释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
